package come.bjpowernode.javase.threadsafe3;
/*
银行账户。
    不使用同步机制，多线程对同一个账户进行取款出现线程安全问题。
 */
public class Account {
    //账号
    private String actno;
    //余额
    private double balance;

    public Account() {
    }

    public Account(String actno, double balance) {
        this.actno = actno;
        this.balance = balance;
    }

    public String getActno() {
        return actno;
    }

    public void setActno(String actno) {
        this.actno = actno;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }
    /*
    在实例方法上使用synchronize，锁的一定是this。
    所以这种方式不灵活。
    还有一个缺点：synchronize出现在方法体上，表示整个方法体都需要同步，
    可能会扩大同步的范围，导致程序的效率降低，所以这种方式不常用。

    synchronize使用在实例方法上有啥好处，代码写的比较少.
    如果共享的对象是this，并且需要同步的代码块是这个方法体，建议使用这种方式。

         */

    //取款方法
    public synchronized void  withdraw(double money){
        //取款之前的余额
        double before = this.balance;
        //取款之后的余额
        double after = before - money;
        //在这里模拟一下网络延迟
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //更新余额
        this.setBalance(after);

    }
}
